#!/bin/sh

# 如果是文件和软连接，打印路径，
# 如果是目录，打印路径后，向下递归
goThroughDir()
{
    if [ $# -eq 0 ]
    then
        # 参数不足异常
        echo "goThroughDir need a filepath as arg"
        return 1
    fi
    
    local fpath=$1
    
    if [ -h $fpath ]
    then
        # 打印软连接路径
        echo "soft link : $fpath"
        return 0
    fi

    if [ -f $fpath ]
    then
        # 打印文件路径
        echo "file:$fpath"
        return 0
    fi

    if [ -d $fpath ]
    then
        # 打印目录路径
        echo "dir:$fpath"

        for sub in `ls $fpath`
        do
            local subPath=$fpath/$sub
            # 向下递归
            goThroughDir $subPath
        done
        return 0
    fi

    echo "do not known:$fpath"
    return 1
}



readFileLineByLine()
{
    if [ $# -eq 0 ]
    then
        # 参数不足异常
        echo "readFileLineByLine need a filepath as arg"
        return 1
    fi
    
    local fpath=$1

    if [ ! -f $fpath ]
    then
        # 打印文件路径
        echo "not a file:$fpath"
        return 1
    fi

    # while 循环 + read + 文件重定向 实现 文件按行读取
    local lineNum=0
    while read line
    do
        let lineNum=$lineNum+1
        echo ${lineNum}' : '$line 
    done < $fpath

    # while 循环 + read + 管道  实现 文件按行读取
    lineNum=0
    cat $fpath | while read line
    do
        let lineNum=$lineNum+1
        echo ${lineNum}' : '$line 
    done
}



wirtePoem2File() 
{

    if [ $# -eq 0 ]
    then
        # 参数不足异常
        echo "readFileLineByLine need a filepath as arg"
        return 1
    fi
    
    local fpath=$1

    local str="水调歌头·明月几时有
苏轼
丙辰中秋，欢饮达旦，大醉，作此篇，兼怀子由

明月几时有？把酒问青天。
不知天上宫阙，今夕是何年。
我欲乘风归去，又恐琼楼玉宇，高处不胜寒。
起舞弄清影，何似在人间。

转朱阁，低绮户，照无眠。
不应有恨，何事长向别时圆？
人有悲欢离合，月有阴晴圆缺，此事古难全。
但愿人长久，千里共婵娟。"

    # >文件重定向符号 覆盖重写一个文件
    echo -e "$str"  > $fpath

    echo -e "\n\n after write, cat $fpath \n\n"
    cat $fpath

    # >文件重定向符号 清空一个文件
    echo -n '' > $fpath
    echo -e "\n\n after clean, cat $fpath \n\n"
    cat $fpath

    # >>文件追加重定向符号 增加内容到文件
    local lineNum=0
    echo -e "$str" | while read line
    do
        let lineNum=$lineNum+1
        echo ${lineNum}' : '$line >> $fpath
    done

    echo -e "\n\n after append, cat $fpath \n\n"
    cat $fpath
}



readWriteBinFile() 
{
    # https://blog.csdn.net/yzhang6_10/article/details/81588282
    # 二进制文件读取示例，以当前shell目录下的 ArrayLoop.class 为输入

    echo ""
    echo "hexdump 默认输出：第1列为偏移量，第2到第17列，显示16个Byte。用两个16进制数表示一个Byte(8个bit, 高4位一个hex、低四位一个hex)"
    hexdump ArrayLoop.class

    echo ""
    echo "hexdump 读取10个字节"
    hexdump -n 10 ArrayLoop.class

    echo ""
    echo "hexdump 跳过16个字节 读取10个字节"
    hexdump -s 16 -n 10 ArrayLoop.class

    echo ""
    echo "hexdump 跳过16个字节 读取10个字节, 格式化：每4个字节换行\\n，每个字节的序号放在括号里面，使用2位hex表示(%_ax)，字节使用2位hex表示%02X"
    hexdump -s 16 -n 10 -e '4/1 "(%_ax)%02X " "\n"' ArrayLoop.class

    echo ""
    echo ""
    echo "使用hexdump输出，组装hex字符串，然后 echo 写 二进制文件tmp/ArrayLoop.class，如果成功，ArrayLoop.class 可以被java执行"
    mkdir tmp
    rm tmp/ArrayLoop.class
    touch tmp/ArrayLoop.class
    hexdump ArrayLoop.class | while read line
    do
        hexStr=$(echo $line|awk '{out="";for(i=2;i<=NF;i++){out=(out "\\x"$i)};print out}')
        echo hexStr:$hexStr
        echo -n -e "$hexStr" >> tmp/ArrayLoop.class
    done

    echo "检测二进制文件tmp/ArrayLoop.class 是否可以被java执行"
    cd tmp
    echo "进入tmp目录，当前路径"
    pwd
    echo "执行 java ArrayLoop"
    java ArrayLoop
    cd -
}



sedDemo() {
    ostr="浔阳江头夜送客，枫叶荻花秋瑟瑟。主人下马客在船，举酒欲饮无管弦。醉不成欢惨将别，别时茫茫江浸月。忽闻水上琵琶声，主人忘归客不发。寻声暗问弹者谁，琵琶声停欲语迟。移船相近邀相见，添酒回灯重开宴。千呼万唤始出来，犹抱琵琶半遮面。转轴拨弦三两声，未成曲调先有情。弦弦掩抑声声思，似诉平生不得志。低眉信手续续弹，说尽心中无限事。轻拢慢捻抹复挑，初为《霓裳》后《六幺》。大弦嘈嘈如急雨，小弦切切如私语。嘈嘈切切错杂弹，大珠小珠落玉盘。间关莺语花底滑，幽咽泉流冰下难。冰泉冷涩弦凝绝，凝绝不通声暂歇。别有幽愁暗恨生，此时无声胜有声。银瓶乍破水浆迸，铁骑突出刀枪鸣。曲终收拨当心画，四弦一声如裂帛。东船西舫悄无言，唯见江心秋月白。沉吟放拨插弦中，整顿衣裳起敛容。自言本是京城女，家在虾蟆陵下住。十三学得琵琶成，名属教坊第一部。曲罢曾教善才服，妆成每被秋娘妒。五陵年少争缠头，一曲红绡不知数。钿头银篦击节碎，血色罗裙翻酒污。今年欢笑复明年，秋月春风等闲度。弟走从军阿姨死，暮去朝来颜色故。门前冷落鞍马稀，老大嫁作商人妇。商人重利轻别离，前月浮梁买茶去。去来江口守空船，绕船月明江水寒。夜深忽梦少年事，梦啼妆泪红阑干。我闻琵琶已叹息，又闻此语重唧唧。同是天涯沦落人，相逢何必曾相识！我从去年辞帝京，谪居卧病浔阳城。浔阳地僻无音乐，终岁不闻丝竹声。住近湓江地低湿，黄芦苦竹绕宅生。其间旦暮闻何物？杜鹃啼血猿哀鸣。春江花朝秋月夜，往往取酒还独倾。岂无山歌与村笛？呕哑嘲哳难为听。今夜闻君琵琶语，如听仙乐耳暂明。莫辞更坐弹一曲，为君翻作《琵琶行》。感我此言良久立，却坐促弦弦转急。凄凄不似向前声，满座重闻皆掩泣。座中泣下谁最多？江州司马青衫湿。"
    
    # 为中文句点 添加 换行符
    echo $ostr | sed 's/。/。\n/g' > pipaPoem.txt

    echo '在文件中搜索 包含 特定字符串的行， 打印出来'
	sed -n "/琵琶/p" pipaPoem.txt

    echo "\n\n在文件中搜索 包含 特定字符串1 的行，替换成字符串2 打印出来"
    sed "s/琵琶/pipa/g" pipaPoem.txt

    # 在文件中搜索 包含 特定字符串1 的行，替换成字符串2 打印出来
    echo "\n\n使用 | 替换 / 作为命令分隔符,方便特定字符串中含有路径分隔符，如此不必大量插入转义符号"
    sed "s|琵琶|pipa|g" pipaPoem.txt
    
    echo "\n\n在文件中搜索 包含 特定字符串1 的行，替换成字符串2 , 直接原地修改文件"
    # -i 后面的参数是备份文件后缀,不想要备份文件写个空字符串
    sed -i '' "s|琵琶|pipa|g" pipaPoem.txt

    echo "\n\n sed 替换后 搜索替换的行"
    grep pipa pipaPoem.txt
}


#goThroughDir ../
#wirtePoem2File ./poem.txt

#echo -e "\n\n readFileLineByLine ./dicDemo.sh \n\n"
#readFileLineByLine ./dicDemo.sh

#readWriteBinFile

sedDemo